package org.dezenho.client.IU;

import java.awt.Color;
import java.awt.Font;
import java.awt.Rectangle;
import java.util.List;

import javax.swing.DefaultListModel;
import javax.swing.JDesktopPane;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.border.LineBorder;

import org.dezenho.client.SO.DezenhoClient;
import org.dezenho.common.RMI.ServerInterface;
/** Classe responsavel pela exibicao da lista de jogadores conectados e que aguardam 
 * o inicio de uma partida.
 * @author dafneguisard
 */
public class SalaEspera extends GenericTela implements SalaEsperaObserver{

	private List<String> jogadoresEsperaObserverState;  //  @jve:decl-index=0:
	private static final long serialVersionUID = 1L;
	private JDesktopPane jDesktopPane = null;
	private JList jList = null;
	private JLabel jLabel = null;
	private JLabel jLabel1 = null;
	private JLabel jLabel2 = null;
	private JLabel jLabel3 = null;
	private ServerInterface server;
	private org.dezenho.client.RN.SalaEspera salaEspera;
	
	/**
	 * Construtor, associa a Sala de Espera Observer (attached)
	 */
	public SalaEspera(){
		super();
		setSalaEspera(DezenhoClient.getInstance().getSalaEspera());
		DezenhoClient.getInstance().getSalaEspera().setSalaEsperaObserver(this);
	}
	/**
	 * Metodo para criar a tela da Sala de Espera
	 * Implementa tambem a acao de desconectar o usuario do servidor quando a janela e fechada
	 * @param jogadoresEspera
	 */
	public void criaTela(List<String> jogadoresEspera) {
		super.criaTela();
		this.setContentPane(getJDesktopPane());
		this.setTitle("Sala de Espera");
		populaJlist(jogadoresEspera);
	}
	/**
	 * Metodo do padrao Observer para atualizacao da lista de jogadores conectados
	 * que serao exibidos na tela Sala de Espera
	 */
	public void updateJogadoresEspera(){
		setJogadoresEsperaObserverState(getSalaEspera().getJogadoresEspera());
		populaJlist(getJogadoresEsperaObserverState());
	}
	
	/**
	 * Metodo para popular a JList que exibira o lista de jogadores conectados
	 * Temos um parametro do tipo list tal que cada elemento sera adicionado 
	 * a uma linha visivel na lista da tela.
	 */
	public void populaJlist(List<String> nomes){
		DefaultListModel lista = new DefaultListModel();
		for (String nome: nomes){
			lista.addElement(nome);
		}
		getJList().setModel(lista);
		getJList().setVisibleRowCount(4);
		getJList().setFixedCellHeight(20);
		getJList().setBorder(new LineBorder(Color.RED));
		getJList().setFont(new Font("Arial", Font.BOLD, 14));
	}
//	metodos de acesso
	private JDesktopPane getJDesktopPane() {
		if (jDesktopPane == null) {
			jLabel3 = new JLabel();
			getJLabel3().setBounds(new Rectangle(97, 5, 301, 97));
			getJLabel3().setIcon(getLogo());
			jLabel2 = new JLabel();
			getJLabel2().setBounds(new Rectangle(11, 472, 468, 34));
			getJLabel2().setFont(new Font("Arial", Font.BOLD, 14));
			getJLabel2().setText("O jogo se iniciara automaticamente quando houver 4 jogadores!");
			jLabel1 = new JLabel();
			getJLabel1().setBounds(new Rectangle(102, 416, 200, 36));
			getJLabel1().setFont(new Font("Arial", Font.BOLD, 14));
			getJLabel1().setText("Por favor aguarde...");
			jLabel = new JLabel();
			getJLabel().setBounds(new Rectangle(183, 119, 150, 24));
			getJLabel().setFont(new Font("Arial", Font.BOLD, 16));
			getJLabel().setText("SALA DE ESPERA");
			jList = new JList();
			getJList().setBounds(new Rectangle(58, 144, 379, 265));
			getJList().setModel(new DefaultListModel());
			getJList().setEnabled(false);
			jDesktopPane = new JDesktopPane();
			jDesktopPane.setBackground(Color.white);
			jDesktopPane.add(jLabel, null);
			jDesktopPane.add(jLabel1, null);
			jDesktopPane.add(jLabel2, null);
			jDesktopPane.add(jLabel3, null);
			jDesktopPane.add(getJList(), null);

		}
		return jDesktopPane;
	}

	private JList getJList() {
		if (jList == null) {
			jList = new JList();
			jList.setBounds(new Rectangle(58, 144, 379, 265));
		}
		return jList;
	}

	public List<String> getJogadoresEsperaObserverState() {
		return jogadoresEsperaObserverState;
	}
	public void setJogadoresEsperaObserverState(
			List<String> jogadoresEsperaObserverState) {
		this.jogadoresEsperaObserverState = jogadoresEsperaObserverState;
	}

	protected org.dezenho.client.RN.SalaEspera getSalaEspera() {
		return salaEspera;
	}
	protected void setSalaEspera(org.dezenho.client.RN.SalaEspera salaEspera) {
		this.salaEspera = salaEspera;
	}
	public JLabel getJLabel() {
		return jLabel;
	}
	public void setJLabel(JLabel label) {
		jLabel = label;
	}
	public JLabel getJLabel1() {
		return jLabel1;
	}
	public void setJLabel1(JLabel label1) {
		jLabel1 = label1;
	}
	public JLabel getJLabel2() {
		return jLabel2;
	}
	public void setJLabel2(JLabel label2) {
		jLabel2 = label2;
	}
	public JLabel getJLabel3() {
		return jLabel3;
	}
	public void setJLabel3(JLabel label3) {
		jLabel3 = label3;
	}
	public void setJList(JList list) {
		jList = list;
	}
	public ServerInterface getServer() {
		return server;
	}

}  //  @jve:decl-index=0:visual-constraint="10,10"
